<<<<<<< .mine
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * GUIStarter.java
 *
 * Created on 17.07.2011, 15:23:19
 */

package tasks;

import java.io.IOException;
import java.util.Date;
import javax.swing.*;
import javax.swing.JOptionPane;


public class GUIStarter extends javax.swing.JFrame {

    /** Creates new form GUIStarter */
    // при старте создаем стуктуру главную и инициализируем основные компоненты GUI 
    public GUIStarter() {
        root = new TaskManageSubsystem(0); 
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        createProcessJButton = new javax.swing.JButton();
        killProcessJButton = new javax.swing.JButton();
        createThreadJButton = new javax.swing.JButton();
        killThreadJButton = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        findJButton = new javax.swing.JButton();
        beforeOrAfterJSlider1 = new javax.swing.JSlider();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        stateJTextArea = new javax.swing.JTextArea();
        findPIDJFormattedTextField = new javax.swing.JFormattedTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        logJTextArea = new javax.swing.JTextArea();
        jLabel4 = new javax.swing.JLabel();
        fileNameJTextField = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        threadsQuantityJFormattedTextField = new javax.swing.JFormattedTextField();
        fileChooseJButton = new javax.swing.JButton();
        hibernateJButton = new javax.swing.JButton();
        unhibernateJButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("TOP");
        setResizable(false);

        jLabel1.setText("Managed process ID:");

        createProcessJButton.setText("Create process");
        createProcessJButton.setToolTipText("Create new process");
        createProcessJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createProcessJButtonActionPerformed(evt);
            }
        });

        killProcessJButton.setText("Kill process");
        killProcessJButton.setToolTipText("Kill process with specified Pid");
        killProcessJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                killProcessJButtonActionPerformed(evt);
            }
        });

        createThreadJButton.setText("Create thread");
        createThreadJButton.setToolTipText("Create thread by specified process");
        createThreadJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createThreadJButtonActionPerformed(evt);
            }
        });

        killThreadJButton.setText("Kill thread");
        killThreadJButton.setToolTipText("Kill thread by specified process");
        killThreadJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                killThreadJButtonActionPerformed(evt);
            }
        });

        findJButton.setText("Find");
        findJButton.setToolTipText("Find process or thread with specified Id");
        findJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                findJButtonActionPerformed(evt);
            }
        });

        beforeOrAfterJSlider1.setMaximum(1);
        beforeOrAfterJSlider1.setPaintLabels(true);
        beforeOrAfterJSlider1.setPaintTicks(true);
        beforeOrAfterJSlider1.setToolTipText("Create process \"before\" or \"after\" specified");

        jLabel2.setText("Create: before");

        jLabel3.setText("after managed");

        stateJTextArea.setColumns(20);
        stateJTextArea.setEditable(false);
        stateJTextArea.setFont(new java.awt.Font("Tahoma", 0, 11));
        stateJTextArea.setRows(5);
        stateJTextArea.setToolTipText("Current system state");
        jScrollPane1.setViewportView(stateJTextArea);

        findPIDJFormattedTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#0"))));
        findPIDJFormattedTextField.setToolTipText("Enter here ID");
        findPIDJFormattedTextField.setName("Process ID"); // NOI18N

        logJTextArea.setColumns(20);
        logJTextArea.setEditable(false);
        logJTextArea.setRows(5);
        logJTextArea.setToolTipText("Logging field");
        jScrollPane2.setViewportView(logJTextArea);

        jLabel4.setText("Tasks(Process ID: Thread ID(Thread state) ...):");

        fileNameJTextField.setEditable(false);
        fileNameJTextField.setText("hiberfil.mys");

        jLabel5.setText("Threads quantity:");

        threadsQuantityJFormattedTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#0"))));
        threadsQuantityJFormattedTextField.setText("50");
        threadsQuantityJFormattedTextField.setName("Threads quantity"); // NOI18N

        fileChooseJButton.setText("...");
        fileChooseJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fileChooseJButtonActionPerformed(evt);
            }
        });

        hibernateJButton.setText("Hibernate");
        hibernateJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                hibernateJButtonActionPerformed(evt);
            }
        });

        unhibernateJButton.setText("Unhibernate");
        unhibernateJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                unhibernateJButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 694, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel4)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 472, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(beforeOrAfterJSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel3))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addGap(16, 16, 16)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 105, Short.MAX_VALUE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(threadsQuantityJFormattedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE)
                                            .addComponent(findJButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                            .addComponent(findPIDJFormattedTextField)
                                            .addComponent(killProcessJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                                    .addComponent(createProcessJButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 206, Short.MAX_VALUE)
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                        .addComponent(createThreadJButton, javax.swing.GroupLayout.DEFAULT_SIZE, 101, Short.MAX_VALUE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(killThreadJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 206, Short.MAX_VALUE)
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                        .addComponent(fileNameJTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 171, Short.MAX_VALUE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(fileChooseJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(hibernateJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(unhibernateJButton, javax.swing.GroupLayout.DEFAULT_SIZE, 95, Short.MAX_VALUE)))))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jLabel4)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 384, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(findPIDJFormattedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(killProcessJButton)
                            .addComponent(findJButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel3)
                            .addComponent(beforeOrAfterJSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(threadsQuantityJFormattedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel5))
                        .addGap(15, 15, 15)
                        .addComponent(createProcessJButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(killThreadJButton)
                            .addComponent(createThreadJButton))
                        .addGap(8, 8, 8)
                        .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(fileNameJTextField)
                            .addComponent(fileChooseJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(hibernateJButton)
                            .addComponent(unhibernateJButton))
                        .addGap(150, 150, 150)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(7, 7, 7))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    
    
    //метод для показа сообщения о результате работы каждого из методов и пишущего в окошко логгера
    private void toLogAppendAndShowMessage(String inpMess) { // принимаем на вход сообщение
        JOptionPane.showMessageDialog(rootPane, inpMess, "Info", WIDTH); // сообщаем сначала в диалоговом окошке информации
        logJTextArea.append("***"+new Date().toString()+ "***: "); //insert current time - добавляем время текущее
        logJTextArea.append(inpMess); // добавляем соответствующее сообщение
        logJTextArea.append("\n"); // не забываем про перевод строки
    }
    
    // метод обновления основного поля для вывода состояния структуры с обработкой возможных исключений
    private void showState() { 
        try {
            stateJTextArea.setText(root.returnTasksState()); // текст в поле для вывода устанавливаем текущему состоянию системы, обрабатываем возможные неприятности
        } catch (NoProcessesException nPE) {
            stateJTextArea.setText(null);
        } catch (NullPointerException nullPE) {
            stateJTextArea.setText(null);
        }
    }
    
    
    //метод для проверки и автоконвертации полей ввода, вводят абракадабру - получаем инт на выходе, если конечно возможно, если не возможно - ловим исключения и обрабатываем
    private int inputChecker(String inputStr, String inputName) throws InputErrorException, NumberFormatException{ //на входе значение поля и имя поля, чтоб сообщить пользователю в чем и где он ошибся
        if (!inputStr.isEmpty()) { //если пустое поле, то и пробовать нечего - искл. ситуация и сообщаем ниже в обработчике
            try {
                int returnedInt = Integer.valueOf(inputStr); //преобразуем в инт и возвращаем
                return returnedInt;
            } catch (NumberFormatException nFormatE) {
                throw new NumberFormatException(nFormatE.getMessage()); // если преобразование не удалось по какой-то причине
            }
        } else {
            throw new InputErrorException("Not valid data in " +inputName + " field");
        }
    }
    
    
    //метод вызывает поиск в структуре и отчитывается о его результатах
    private void findJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_findJButtonActionPerformed
        try {
            if (root.isEmpty()) { // нет процессов - нечего и негде искать - искл. ситуация
                throw new NoProcessesException();
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); // преобразуем введенное пользователем в инт
            ProcessDesc current = root.find(findingId); //метод поиска в структуре
            if (current.getCurrent().getId() == findingId) {
                toLogAppendAndShowMessage("Process with specified PID: "+ findingId + " finded"); //если нет исключения, что не нашел, то что-то значит нашел
                // либо процесс, тогда мы в этой ветке, либо поток, тогда окажемся ниже(else), соответственно сообщаем об этом пользователю
            } else {
                toLogAppendAndShowMessage("Process with PID: " + current.getCurrent().getId()+" with specified thread TID: "+ findingId + " finded");
            }            
        } catch (NoProcessesException nPE) {
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) {
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        }
    }//GEN-LAST:event_findJButtonActionPerformed

    
    //кнопочка убить процесс проверяет введенное значение PID'а процесса, вызывает метод killProcess, отчитывается о проделанной работе, обновляет поле
    private void killProcessJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killProcessJButtonActionPerformed
        try {
            if (root.isEmpty()) {
                throw new NoProcessesException(); //проверяем есть ли хоть один процесс
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); //преобразуем введенные в поле данные в инт
            ProcessDesc current = root.killProcess(findingId); //пытаемся убить указанный процесс
            toLogAppendAndShowMessage("Process with specified PID succesfully killed with state: " + findingId +": "+ current.getCurrent().returnThreadsState()); //отчитываемся об успешности
            showState(); //обновляем состояние поля для вывода состояния
        } catch (NoProcessesException nPE) { //если нет процессов
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) { //если введенные данные непреобразуемы
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) { // если указанный процесс не найден
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) { //если введенные данные непреобразуемы
            toLogAppendAndShowMessage(iIE.getMessage());
        }
    }//GEN-LAST:event_killProcessJButtonActionPerformed

    
    //метод при нажатии на кнопку создания процесса
    private void createProcessJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createProcessJButtonActionPerformed
        try {
            int findingId = 0;
            if (!root.isEmpty()) { //если есть процессы, обрабатываем поле для ввода PID'а
                findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName());
            }
            boolean isAfterCurrent = true; // по умолчанию вставляем после указанного процесса
            if (beforeOrAfterJSlider1.getValue() == 0) { // если вдруг надо вставить до(переключатель в этом положении)
                isAfterCurrent = false;
            }
            int threadsQuantity = inputChecker(threadsQuantityJFormattedTextField.getText(), threadsQuantityJFormattedTextField.getName()); // проверяем, что нам там навводили
            ProcessDesc newProcDesc = root.createProcess(findingId, isAfterCurrent, threadsQuantity); //вызываем метод создания процесса
            toLogAppendAndShowMessage("Process created with state: " + newProcDesc.getCurrent().getId()+" : " +newProcDesc.getCurrent().returnThreadsState()); // отчитываемся об успешном результате
            showState(); // обновляем поле состояния структуры
        } catch (NumberFormatException nFormatE) { //тут и далее обрабатываем все возможные исключения
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        }
    }//GEN-LAST:event_createProcessJButtonActionPerformed

    
    // создаем поток у указанного процесса
    private void createThreadJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createThreadJButtonActionPerformed
        try {
            if (root.isEmpty()) { // если нет процессов, создавать не у кого - исключение
                throw new NoProcessesException();
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); // проверяем ввод пользовотеля
            ProcessDesc current = root.find(findingId); // задействуем метод поиска процесса с заданным PID'ом
            if (current.getCurrent().getId() == findingId) {
                if (current.getCurrent().isFull()) { // если кол-во потоков у процесса итак предельно - исключение
                    throw new FullException("To many threads");
                }
                int tID = root.getNextPid(); // получаем айди для нового потока
                current.getCurrent().createThread(tID); // создаем новый поток
                toLogAppendAndShowMessage("Thread with TID: " + tID +" succesfully created by process with specified PID. Current state: " + findingId +": "+ current.getCurrent().returnThreadsState());
                showState(); // отрапортовали и обновили поле вывода
            } else {
                toLogAppendAndShowMessage("There is thread with specified TID: "+ findingId + ", no process with specified Id, thread belongs to process with this PID: " + current.getCurrent().getId()+ ". Try again with another PID");                
            }
        } catch (NoProcessesException nPE) { //здесь и ниже обрабатываем исключения
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) {
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        } catch (FullException fE) {
            toLogAppendAndShowMessage(fE.getMessage());
        }
    }//GEN-LAST:event_createThreadJButtonActionPerformed

    
    //убиваем поток у указанного процесса
    private void killThreadJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killThreadJButtonActionPerformed
        try {
            if (root.isEmpty()) {
                throw new NoProcessesException(); // нет процессов - работать не с кем: исключение
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); // проверяем ввод пользоователя, получаем инт
            ProcessDesc current = root.find(findingId); //ищем процесс с указанным PID'ом
            if (current.getCurrent().getId() == findingId) { //если нашли, убиваем очередной поток у него и рапортуем об этом
                Thread temp = current.getCurrent().killThread();
                toLogAppendAndShowMessage("Thread with TID: " + temp.getId() +" succesfully killed by process with specified PID. Current state: " + findingId +": "+ current.getCurrent().returnThreadsState());
                showState();
            } else {
                toLogAppendAndShowMessage("There is thread with specified TID: "+ findingId + ", no process with specified Id, thread belongs to process with this PID: " + current.getCurrent().getId()+ ". Try again with another PID");                
            }
        } catch (NoProcessesException nPE) { //обрабатываем исключения
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) {
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        } catch (OneThreadedException oTE) {
            toLogAppendAndShowMessage(oTE.getMessage());
        }
    }//GEN-LAST:event_killThreadJButtonActionPerformed

    
    // метод диалога по выбору файла
    private void fileChooseJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileChooseJButtonActionPerformed
        JFileChooser dialog = new JFileChooser(); // создаем диалог выбора файла по щелчку на соответствующей кнопке 
        dialog.setFileSelectionMode(JFileChooser.FILES_ONLY); // устанавливаем, что выбрать можно только файл
        dialog.setApproveButtonText("Choose"); // устанавливаем название кнопки
        dialog.setDialogTitle("Choose hibernate file"); // устанавливаем заголовок
        dialog.setDialogType(JFileChooser.OPEN_DIALOG); // устанавливаем тип диалога
        dialog.setMultiSelectionEnabled(false);  // не разрешаем выбирать сразу несколько файлов
        dialog.showOpenDialog(this); // показываем сформированный диалог
        if (dialog.getSelectedFile() != null) {
            fileNameJTextField.setText(dialog.getSelectedFile().getPath()); //если пользователь выбрал файл, а не надал отмену - устанавливаем значение пути в ссответствующее поле
        } 
        //setVisible(true);
    }//GEN-LAST:event_fileChooseJButtonActionPerformed
    
    
    //гибернация в указанный файл
    private void hibernateJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hibernateJButtonActionPerformed
        try {
            String fileName = fileNameJTextField.getText(); // получаем имя файла из поля имени файла
            TaskManageSubsystem.hibernate(root, fileName); // вызываем метод гибернации в указанный файл
            toLogAppendAndShowMessage("System succesfully hibernated. Hiberfile is: "+ fileName); //отчитываемся об успешном сохранении
            root = new TaskManageSubsystem(0); // забываем о старой структуре, создаем новую
            showState(); // обновляем поле вывода состояния
        } catch (IOException ioE) {
            toLogAppendAndShowMessage(ioE.getMessage()); // обрабатываем возможные исключения
        } catch (NoProcessesException nPE) {
            toLogAppendAndShowMessage(nPE.getMessage()); 
        }
    }//GEN-LAST:event_hibernateJButtonActionPerformed

    private void unhibernateJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unhibernateJButtonActionPerformed
        try {
            String fileName = fileNameJTextField.getText(); // получаем из поля имени файла имя
            root = TaskManageSubsystem.unhibernate(fileName); // дегибернируем :-)
            toLogAppendAndShowMessage("System succesfully unhibernated. Hiberfile is: "+ fileName); // показываем, что удалось
            showState(); // обновляем поле для вывода состояния
        } catch (IOException ioE) { // обрабатываем исключения
            toLogAppendAndShowMessage(ioE.getMessage());  
        } catch (ClassNotFoundException cNFE) {
            toLogAppendAndShowMessage(cNFE.getMessage());
        } 
    }//GEN-LAST:event_unhibernateJButtonActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JSlider beforeOrAfterJSlider1;
    private javax.swing.JButton createProcessJButton;
    private javax.swing.JButton createThreadJButton;
    private javax.swing.JButton fileChooseJButton;
    private javax.swing.JTextField fileNameJTextField;
    private javax.swing.JButton findJButton;
    private javax.swing.JFormattedTextField findPIDJFormattedTextField;
    private javax.swing.JButton hibernateJButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JButton killProcessJButton;
    private javax.swing.JButton killThreadJButton;
    private javax.swing.JTextArea logJTextArea;
    private javax.swing.JTextArea stateJTextArea;
    private javax.swing.JFormattedTextField threadsQuantityJFormattedTextField;
    private javax.swing.JButton unhibernateJButton;
    // End of variables declaration//GEN-END:variables
    TaskManageSubsystem root;
}
=======
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * GUIStarter.java
 *
 * Created on 17.07.2011, 15:23:19
 */

package kurs;

//import java.awt.Container;
//import java.awt.*;
import java.io.IOException;
//import java.io.FileNotFoundException;
import java.util.Date;
import javax.swing.*;
import javax.swing.JOptionPane;

/**
 *
 * @author Matrix
 */
public class GUIStarter extends javax.swing.JFrame {

    /** Creates new form GUIStarter */
    // при старте создаем стуктуру главную и инициализируем основные компоненты GUI 
    public GUIStarter() {
        root = new TaskManageSubsystem(0); 
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        createProcessJButton = new javax.swing.JButton();
        killProcessJButton = new javax.swing.JButton();
        createThreadJButton = new javax.swing.JButton();
        killThreadJButton = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        findJButton = new javax.swing.JButton();
        beforeOrAfterJSlider1 = new javax.swing.JSlider();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        stateJTextArea = new javax.swing.JTextArea();
        findPIDJFormattedTextField = new javax.swing.JFormattedTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        logJTextArea = new javax.swing.JTextArea();
        jLabel4 = new javax.swing.JLabel();
        fileNameJTextField = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        threadsQuantityJFormattedTextField = new javax.swing.JFormattedTextField();
        fileChooseJButton = new javax.swing.JButton();
        hibernateJButton = new javax.swing.JButton();
        unhibernateJButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("TOP");
        setResizable(false);

        jLabel1.setText("Managed process ID:");

        createProcessJButton.setText("Create process");
        createProcessJButton.setToolTipText("Create new process");
        createProcessJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createProcessJButtonActionPerformed(evt);
            }
        });

        killProcessJButton.setText("Kill process");
        killProcessJButton.setToolTipText("Kill process with specified Pid");
        killProcessJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                killProcessJButtonActionPerformed(evt);
            }
        });

        createThreadJButton.setText("Create thread");
        createThreadJButton.setToolTipText("Create thread by specified process");
        createThreadJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createThreadJButtonActionPerformed(evt);
            }
        });

        killThreadJButton.setText("Kill thread");
        killThreadJButton.setToolTipText("Kill thread by specified process");
        killThreadJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                killThreadJButtonActionPerformed(evt);
            }
        });

        findJButton.setText("Find");
        findJButton.setToolTipText("Find process or thread with specified Id");
        findJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                findJButtonActionPerformed(evt);
            }
        });

        beforeOrAfterJSlider1.setMaximum(1);
        beforeOrAfterJSlider1.setPaintLabels(true);
        beforeOrAfterJSlider1.setPaintTicks(true);
        beforeOrAfterJSlider1.setToolTipText("Create process \"before\" or \"after\" specified");

        jLabel2.setText("Create: before");

        jLabel3.setText("after managed");

        stateJTextArea.setColumns(20);
        stateJTextArea.setEditable(false);
        stateJTextArea.setFont(new java.awt.Font("Tahoma", 0, 11));
        stateJTextArea.setRows(5);
        stateJTextArea.setToolTipText("Current system state");
        jScrollPane1.setViewportView(stateJTextArea);

        findPIDJFormattedTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#0"))));
        findPIDJFormattedTextField.setToolTipText("Enter here ID");
        findPIDJFormattedTextField.setName("Process ID"); // NOI18N

        logJTextArea.setColumns(20);
        logJTextArea.setEditable(false);
        logJTextArea.setRows(5);
        logJTextArea.setToolTipText("Logging field");
        jScrollPane2.setViewportView(logJTextArea);

        jLabel4.setText("Tasks(Process ID: Thread ID(Thread state) ...):");

        fileNameJTextField.setEditable(false);
        fileNameJTextField.setText("hiberfil.mys");

        jLabel5.setText("Threads quantity:");

        threadsQuantityJFormattedTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#0"))));
        threadsQuantityJFormattedTextField.setText("50");
        threadsQuantityJFormattedTextField.setName("Threads quantity"); // NOI18N

        fileChooseJButton.setText("...");
        fileChooseJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fileChooseJButtonActionPerformed(evt);
            }
        });

        hibernateJButton.setText("Hibernate");
        hibernateJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                hibernateJButtonActionPerformed(evt);
            }
        });

        unhibernateJButton.setText("Unhibernate");
        unhibernateJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                unhibernateJButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 694, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel4)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 472, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(beforeOrAfterJSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel3))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addGap(16, 16, 16)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 105, Short.MAX_VALUE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(threadsQuantityJFormattedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE)
                                            .addComponent(findJButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                            .addComponent(findPIDJFormattedTextField)
                                            .addComponent(killProcessJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                                    .addComponent(createProcessJButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 206, Short.MAX_VALUE)
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                        .addComponent(createThreadJButton, javax.swing.GroupLayout.DEFAULT_SIZE, 101, Short.MAX_VALUE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(killThreadJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 206, Short.MAX_VALUE)
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                        .addComponent(fileNameJTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 171, Short.MAX_VALUE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(fileChooseJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(hibernateJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(unhibernateJButton, javax.swing.GroupLayout.DEFAULT_SIZE, 95, Short.MAX_VALUE)))))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jLabel4)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 384, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(findPIDJFormattedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(killProcessJButton)
                            .addComponent(findJButton))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel3)
                            .addComponent(beforeOrAfterJSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(threadsQuantityJFormattedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel5))
                        .addGap(15, 15, 15)
                        .addComponent(createProcessJButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(killThreadJButton)
                            .addComponent(createThreadJButton))
                        .addGap(8, 8, 8)
                        .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(fileNameJTextField)
                            .addComponent(fileChooseJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(hibernateJButton)
                            .addComponent(unhibernateJButton))
                        .addGap(150, 150, 150)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(7, 7, 7))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    
    
    //метод для показа сообщения о результате работы каждого из методов и пишущего в окошко логгера
    private void toLogAppendAndShowMessage(String inpMess) { // принимаем на вход сообщение
        JOptionPane.showMessageDialog(rootPane, inpMess, "Info", WIDTH); // сообщаем сначала в диалоговом окошке информации
        logJTextArea.append("***"+new Date().toString()+ "***: "); //insert current time - добавляем время текущее
        logJTextArea.append(inpMess); // добавляем соответствующее сообщение
        logJTextArea.append("\n"); // не забываем про перевод строки
    }
    
    // метод обновления основного поля для вывода состояния структуры с обработкой возможных исключений
    private void showState() { 
        try {
            stateJTextArea.setText(root.returnTasksState()); // текст в поле для вывода устанавливаем текущему состоянию системы, обрабатываем возможные неприятности
        } catch (NoProcessesException nPE) {
            stateJTextArea.setText(null);
        } catch (NullPointerException nullPE) {
            stateJTextArea.setText(null);
        }
    }
    
    
    //метод для проверки и автоконвертации полей ввода, вводят абракадабру - получаем инт на выходе, если конечно возможно, если не возможно - ловим исключения и обрабатываем
    private int inputChecker(String inputStr, String inputName) throws InputErrorException, NumberFormatException{ //на входе значение поля и имя поля, чтоб сообщить пользователю в чем и где он ошибся
        if (!inputStr.isEmpty()) { //если пустое поле, то и пробовать нечего - искл. ситуация и сообщаем ниже в обработчике
            try {
                int returnedInt = Integer.valueOf(inputStr); //преобразуем в инт и возвращаем
                return returnedInt;
            } catch (NumberFormatException nFormatE) {
                throw new NumberFormatException(nFormatE.getMessage()); // если преобразование не удалось по какой-то причине
            }
        } else {
            throw new InputErrorException("Not valid data in " +inputName + " field");
        }
    }
    
    
    //метод вызывает поиск в структуре и отчитывается о его результатах
    private void findJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_findJButtonActionPerformed
        try {
            if (root.isEmpty()) { // нет процессов - нечего и негде искать - искл. ситуация
                throw new NoProcessesException();
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); // преобразуем введенное пользователем в инт
            ProcessDesc current = root.find(findingId); //метод поиска в структуре
            if (current.getCurrent().getId() == findingId) {
                toLogAppendAndShowMessage("Process with specified PID: "+ findingId + " finded"); //если нет исключения, что не нашел, то что-то значит нашел
                // либо процесс, тогда мы в этой ветке, либо поток, тогда окажемся ниже(else), соответственно сообщаем об этом пользователю
            } else {
                toLogAppendAndShowMessage("Process with PID: " + current.getCurrent().getId()+" with specified thread TID: "+ findingId + " finded");
            }            
        } catch (NoProcessesException nPE) {
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) {
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        }
    }//GEN-LAST:event_findJButtonActionPerformed

    
    //кнопочка убить процесс проверяет введенное значение PID'а процесса, вызывает метод killProcess, отчитывается о проделанной работе, обновляет поле
    private void killProcessJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killProcessJButtonActionPerformed
        try {
            if (root.isEmpty()) {
                throw new NoProcessesException(); //проверяем есть ли хоть один процесс
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); //преобразуем введенные в поле данные в инт
            ProcessDesc current = root.killProcess(findingId); //пытаемся убить указанный процесс
            toLogAppendAndShowMessage("Process with specified PID succesfully killed with state: " + findingId +": "+ current.getCurrent().returnThreadsState()); //отчитываемся об успешности
            showState(); //обновляем состояние поля для вывода состояния
        } catch (NoProcessesException nPE) { //если нет процессов
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) { //если введенные данные непреобразуемы
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) { // если указанный процесс не найден
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) { //если введенные данные непреобразуемы
            toLogAppendAndShowMessage(iIE.getMessage());
        }
    }//GEN-LAST:event_killProcessJButtonActionPerformed

    
    //метод при нажатии на кнопку создания процесса
    private void createProcessJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createProcessJButtonActionPerformed
        try {
            int findingId = 0;
            if (!root.isEmpty()) { //если есть процессы, обрабатываем поле для ввода PID'а
                findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName());
            }
            boolean isAfterCurrent = true; // по умолчанию вставляем после указанного процесса
            if (beforeOrAfterJSlider1.getValue() == 0) { // если вдруг надо вставить до(переключатель в этом положении)
                isAfterCurrent = false;
            }
            int threadsQuantity = inputChecker(threadsQuantityJFormattedTextField.getText(), threadsQuantityJFormattedTextField.getName()); // проверяем, что нам там навводили
            ProcessDesc newProcDesc = root.createProcess(findingId, isAfterCurrent, threadsQuantity); //вызываем метод создания процесса
            toLogAppendAndShowMessage("Process created with state: " + newProcDesc.getCurrent().getId()+" : " +newProcDesc.getCurrent().returnThreadsState()); // отчитываемся об успешном результате
            showState(); // обновляем поле состояния структуры
        } catch (NumberFormatException nFormatE) { //тут и далее обрабатываем все возможные исключения
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        }
    }//GEN-LAST:event_createProcessJButtonActionPerformed

    
    // создаем поток у указанного процесса
    private void createThreadJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createThreadJButtonActionPerformed
        try {
            if (root.isEmpty()) { // если нет процессов, создавать не у кого - исключение
                throw new NoProcessesException();
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); // проверяем ввод пользовотеля
            ProcessDesc current = root.find(findingId); // задействуем метод поиска процесса с заданным PID'ом
            if (current.getCurrent().getId() == findingId) {
                if (current.getCurrent().isFull()) { // если кол-во потоков у процесса итак предельно - исключение
                    throw new FullException("To many threads");
                }
                int tID = root.getNextPid(); // получаем айди для нового потока
                current.getCurrent().createThread(tID); // создаем новый поток
                toLogAppendAndShowMessage("Thread with TID: " + tID +" succesfully created by process with specified PID. Current state: " + findingId +": "+ current.getCurrent().returnThreadsState());
                showState(); // отрапортовали и обновили поле вывода
            } else {
                toLogAppendAndShowMessage("There is thread with specified TID: "+ findingId + ", no process with specified Id, thread belongs to process with this PID: " + current.getCurrent().getId()+ ". Try again with another PID");                
            }
        } catch (NoProcessesException nPE) { //здесь и ниже обрабатываем исключения
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) {
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        } catch (FullException fE) {
            toLogAppendAndShowMessage(fE.getMessage());
        }
    }//GEN-LAST:event_createThreadJButtonActionPerformed

    
    //убиваем поток у указанного процесса
    private void killThreadJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killThreadJButtonActionPerformed
        try {
            if (root.isEmpty()) {
                throw new NoProcessesException(); // нет процессов - работать не с кем: исключение
            }
            int findingId = inputChecker(findPIDJFormattedTextField.getText(), findPIDJFormattedTextField.getName()); // проверяем ввод пользоователя, получаем инт
            ProcessDesc current = root.find(findingId); //ищем процесс с указанным PID'ом
            if (current.getCurrent().getId() == findingId) { //если нашли, убиваем очередной поток у него и рапортуем об этом
                Thread temp = current.getCurrent().killThread();
                toLogAppendAndShowMessage("Thread with TID: " + temp.getId() +" succesfully killed by process with specified PID. Current state: " + findingId +": "+ current.getCurrent().returnThreadsState());
                showState();
            } else {
                toLogAppendAndShowMessage("There is thread with specified TID: "+ findingId + ", no process with specified Id, thread belongs to process with this PID: " + current.getCurrent().getId()+ ". Try again with another PID");                
            }
        } catch (NoProcessesException nPE) { //обрабатываем исключения
            toLogAppendAndShowMessage(nPE.getMessage());
        } catch (NumberFormatException nFormatE) {
            toLogAppendAndShowMessage(nFormatE.getMessage());
        } catch (NotFoundException nFE) {
            toLogAppendAndShowMessage(nFE.getMessage());
        } catch (InputErrorException iIE) {
            toLogAppendAndShowMessage(iIE.getMessage());
        } catch (OneThreadedException oTE) {
            toLogAppendAndShowMessage(oTE.getMessage());
        }
    }//GEN-LAST:event_killThreadJButtonActionPerformed

    
    // метод диалога по выбору файла
    private void fileChooseJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileChooseJButtonActionPerformed
        JFileChooser dialog = new JFileChooser(); // создаем диалог выбора файла по щелчку на соответствующей кнопке 
        dialog.setFileSelectionMode(JFileChooser.FILES_ONLY); // устанавливаем, что выбрать можно только файл
        dialog.setApproveButtonText("Choose"); // устанавливаем название кнопки
        dialog.setDialogTitle("Choose hibernate file"); // устанавливаем заголовок
        dialog.setDialogType(JFileChooser.OPEN_DIALOG); // устанавливаем тип диалога
        dialog.setMultiSelectionEnabled(false);  // не разрешаем выбирать сразу несколько файлов
        dialog.showOpenDialog(this); // показываем сформированный диалог
        if (dialog.getSelectedFile() != null) {
            fileNameJTextField.setText(dialog.getSelectedFile().getPath()); //если пользователь выбрал файл, а не надал отмену - устанавливаем значение пути в ссответствующее поле
        } 
        //setVisible(true);
    }//GEN-LAST:event_fileChooseJButtonActionPerformed
    
    
    //гибернация в указанный файл
    private void hibernateJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hibernateJButtonActionPerformed
        try {
            String fileName = fileNameJTextField.getText(); // получаем имя файла из поля имени файла
            TaskManageSubsystem.hibernate(root, fileName); // вызываем метод гибернации в указанный файл
            toLogAppendAndShowMessage("System succesfully hibernated. Hiberfile is: "+ fileName); //отчитываемся об успешном сохранении
            root = new TaskManageSubsystem(0); // забываем о старой структуре, создаем новую
            showState(); // обновляем поле вывода состояния
        } catch (IOException ioE) {
            toLogAppendAndShowMessage(ioE.getMessage()); // обрабатываем возможные исключения
        } catch (NoProcessesException nPE) {
            toLogAppendAndShowMessage(nPE.getMessage()); 
        }
    }//GEN-LAST:event_hibernateJButtonActionPerformed

    private void unhibernateJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_unhibernateJButtonActionPerformed
        try {
            String fileName = fileNameJTextField.getText(); // получаем из поля имени файла имя
            root = TaskManageSubsystem.unhibernate(fileName); // дегибернируем :-)
            toLogAppendAndShowMessage("System succesfully unhibernated. Hiberfile is: "+ fileName); // показываем, что удалось
            showState(); // обновляем поле для вывода состояния
        } catch (IOException ioE) { // обрабатываем исключения
            toLogAppendAndShowMessage(ioE.getMessage());  
        } catch (ClassNotFoundException cNFE) {
            toLogAppendAndShowMessage(cNFE.getMessage());
        } 
    }//GEN-LAST:event_unhibernateJButtonActionPerformed

    /**
    * @param args the command line arguments
    */
//    public static void main(String args[]) {
//        java.awt.EventQueue.invokeLater(new Runnable() {
//            public void run() {
//                new GUIStarter().setVisible(true);
//            }
//        });
//
//    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JSlider beforeOrAfterJSlider1;
    private javax.swing.JButton createProcessJButton;
    private javax.swing.JButton createThreadJButton;
    private javax.swing.JButton fileChooseJButton;
    private javax.swing.JTextField fileNameJTextField;
    private javax.swing.JButton findJButton;
    private javax.swing.JFormattedTextField findPIDJFormattedTextField;
    private javax.swing.JButton hibernateJButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JButton killProcessJButton;
    private javax.swing.JButton killThreadJButton;
    private javax.swing.JTextArea logJTextArea;
    private javax.swing.JTextArea stateJTextArea;
    private javax.swing.JFormattedTextField threadsQuantityJFormattedTextField;
    private javax.swing.JButton unhibernateJButton;
    // End of variables declaration//GEN-END:variables
    TaskManageSubsystem root;
}
>>>>>>> .r60
